package lc130;

public class Lc130_1 {

    /**
     * 1.把所有周边的O变成#
     * 2.把剩下的O变成X
     * 3.最后把#变回O
     */
    public void solve(char[][] board) {
        // 长度
        int l = board.length;
        if(l == 0){
            return;
        }
        // 高度
        int h = board[0].length;
        // 遍历所有元素
        for(int i = 0; i < l; i++){
            // 第一列 最后一列
            if(i == 0 || i == l - 1){
                for(int j = 0; j < h; j++){
                    fill(i, j, board, l, h);
                }
            }
            // 第一行和最后一行
            fill(i, 0, board, l, h);
            fill(i, h - 1, board, l, h);
        }
        for(int i = 0; i < l; i++){
            for(int j = 0; j < h; j++){
                if(board[i][j] == 'O'){
                    board[i][j] = 'X';
                }
                if(board[i][j] == '#'){
                    board[i][j] = 'O';
                }
            }
        }
    }

    private void fill(int i, int j, char[][] board, int l, int h) {
        if(i < 0 || i >= l || j < 0 || j >= h || board[i][j] == 'X' || board[i][j] == '#'){
            return;
        }
        board[i][j] = '#';
        // 处理中间和边界相邻的O
        fill(i - 1, j, board, l, h);
        fill(i, j + 1, board, l, h);
        fill(i + 1, j, board, l, h);
        fill(i, j - 1, board, l, h);
    }

}
